{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "from keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau,TensorBoard\n",
    "from keras.optimizers import Adam\n",
    "from keras import backend as K\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "from losses import bce_dice_loss\n",
    "from rssegnet import RSSegResNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def adjust_data(img,mask):\n",
    "    mean_ = np.array([77.79408427,  89.68194542, 101.41694189])\n",
    "    img = (img - mean_) / 255\n",
    "    mask = mask /255\n",
    "    mask[mask > 0.5] = 1\n",
    "    mask[mask <= 0.5] = 0\n",
    "    return (img,mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_train_generator():\n",
    "    train_data_root = 'D:/Data/mc_data/train'  # 训练集存放路径\n",
    "\n",
    "    # data augmentation\n",
    "    # data_gen_args = dict(rotation_range=0.2,\n",
    "    #                     width_shift_range=0.05,\n",
    "    #                     height_shift_range=0.05,\n",
    "    #                     shear_range=0.05,\n",
    "    #                     zoom_range=0.05,\n",
    "    #                     horizontal_flip=True,\n",
    "    #                     fill_mode='nearest')\n",
    "    data_gen_args = dict()\n",
    "\n",
    "    train_image_datagen = ImageDataGenerator(**data_gen_args)\n",
    "    train_mask_datagen = ImageDataGenerator(**data_gen_args)\n",
    "\n",
    "    seed=1\n",
    "\n",
    "    train_image_generator = train_image_datagen.flow_from_directory(\n",
    "        train_data_root + '/images',\n",
    "        target_size=(288,288),\n",
    "        class_mode=None,\n",
    "        batch_size=8,\n",
    "        seed=seed,\n",
    "        color_mode='rgb')\n",
    "\n",
    "    train_mask_generator = train_mask_datagen.flow_from_directory(\n",
    "        train_data_root + '/masks',\n",
    "        target_size=(288,288),\n",
    "        class_mode=None,\n",
    "        batch_size=8,\n",
    "        seed=seed,\n",
    "        color_mode='grayscale')\n",
    "\n",
    "    # combine generators into one which yields image and masks\n",
    "    train_generator = zip(train_image_generator, train_mask_generator)\n",
    "    \n",
    "    for (image, mask) in train_generator:\n",
    "#         print(image.shape)\n",
    "#         print(mask.shape)\n",
    "        yield adjust_data(image, mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_val_generator():\n",
    "    val_data_root = 'D:/Data/mc_data/val'  # 验证集存放路径\n",
    "    \n",
    "    # data augmentation\n",
    "    # data_gen_args = dict(rotation_range=0.2,\n",
    "    #                     width_shift_range=0.05,\n",
    "    #                     height_shift_range=0.05,\n",
    "    #                     shear_range=0.05,\n",
    "    #                     zoom_range=0.05,\n",
    "    #                     horizontal_flip=True,\n",
    "    #                     fill_mode='nearest')\n",
    "    data_gen_args = dict()\n",
    "\n",
    "    val_image_datagen = ImageDataGenerator(**data_gen_args)\n",
    "    val_mask_datagen = ImageDataGenerator(**data_gen_args)\n",
    "\n",
    "    seed = 1\n",
    "\n",
    "    val_image_generator = val_image_datagen.flow_from_directory(\n",
    "        val_data_root + '/images',\n",
    "        target_size=(288,288),\n",
    "        class_mode=None,\n",
    "        batch_size=8,\n",
    "        seed=seed,\n",
    "        color_mode='rgb')\n",
    "\n",
    "    val_mask_generator = val_mask_datagen.flow_from_directory(\n",
    "        val_data_root + '/masks',\n",
    "        target_size=(288,288),\n",
    "        class_mode=None,\n",
    "        batch_size=8,\n",
    "        seed=seed,\n",
    "        color_mode='grayscale')\n",
    "\n",
    "    val_generator = zip(val_image_generator, val_mask_generator)\n",
    "    \n",
    "    for (image, mask) in val_generator:\n",
    "#         print(image.shape)\n",
    "#         print(mask.shape)\n",
    "        yield adjust_data(image, mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "image_input (InputLayer)        (None, 288, 288, 3)  0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_1 (Conv2D)               (None, 144, 144, 64) 9472        image_input[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_1 (BatchNor (None, 144, 144, 64) 256         conv2d_1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "activation_1 (Activation)       (None, 144, 144, 64) 0           batch_normalization_1[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2D)  (None, 72, 72, 64)   0           activation_1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_2 (Conv2D)               (None, 72, 72, 64)   36928       max_pooling2d_1[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_2 (BatchNor (None, 72, 72, 64)   256         conv2d_2[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "activation_2 (Activation)       (None, 72, 72, 64)   0           batch_normalization_2[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_3 (Conv2D)               (None, 72, 72, 64)   36928       activation_2[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "add_1 (Add)                     (None, 72, 72, 64)   0           max_pooling2d_1[0][0]            \n",
      "                                                                 conv2d_3[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_3 (BatchNor (None, 72, 72, 64)   256         add_1[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_3 (Activation)       (None, 72, 72, 64)   0           batch_normalization_3[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_4 (Conv2D)               (None, 72, 72, 64)   36928       activation_3[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_4 (BatchNor (None, 72, 72, 64)   256         conv2d_4[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "activation_4 (Activation)       (None, 72, 72, 64)   0           batch_normalization_4[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_5 (Conv2D)               (None, 72, 72, 64)   36928       activation_4[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "add_2 (Add)                     (None, 72, 72, 64)   0           add_1[0][0]                      \n",
      "                                                                 conv2d_5[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_5 (BatchNor (None, 72, 72, 64)   256         add_2[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_5 (Activation)       (None, 72, 72, 64)   0           batch_normalization_5[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_6 (Conv2D)               (None, 72, 72, 64)   36928       activation_5[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_6 (BatchNor (None, 72, 72, 64)   256         conv2d_6[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "activation_6 (Activation)       (None, 72, 72, 64)   0           batch_normalization_6[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_7 (Conv2D)               (None, 72, 72, 64)   36928       activation_6[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "add_3 (Add)                     (None, 72, 72, 64)   0           add_2[0][0]                      \n",
      "                                                                 conv2d_7[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_7 (BatchNor (None, 72, 72, 64)   256         add_3[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_7 (Activation)       (None, 72, 72, 64)   0           batch_normalization_7[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_8 (Conv2D)               (None, 36, 36, 128)  73856       activation_7[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_8 (BatchNor (None, 36, 36, 128)  512         conv2d_8[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "activation_8 (Activation)       (None, 36, 36, 128)  0           batch_normalization_8[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_10 (Conv2D)              (None, 36, 36, 128)  8320        add_3[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_9 (Conv2D)               (None, 36, 36, 128)  147584      activation_8[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "add_4 (Add)                     (None, 36, 36, 128)  0           conv2d_10[0][0]                  \n",
      "                                                                 conv2d_9[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_9 (BatchNor (None, 36, 36, 128)  512         add_4[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_9 (Activation)       (None, 36, 36, 128)  0           batch_normalization_9[0][0]      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_11 (Conv2D)              (None, 36, 36, 128)  147584      activation_9[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_10 (BatchNo (None, 36, 36, 128)  512         conv2d_11[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_10 (Activation)      (None, 36, 36, 128)  0           batch_normalization_10[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_12 (Conv2D)              (None, 36, 36, 128)  147584      activation_10[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_5 (Add)                     (None, 36, 36, 128)  0           add_4[0][0]                      \n",
      "                                                                 conv2d_12[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_11 (BatchNo (None, 36, 36, 128)  512         add_5[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_11 (Activation)      (None, 36, 36, 128)  0           batch_normalization_11[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_13 (Conv2D)              (None, 36, 36, 128)  147584      activation_11[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_12 (BatchNo (None, 36, 36, 128)  512         conv2d_13[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_12 (Activation)      (None, 36, 36, 128)  0           batch_normalization_12[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_14 (Conv2D)              (None, 36, 36, 128)  147584      activation_12[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_6 (Add)                     (None, 36, 36, 128)  0           add_5[0][0]                      \n",
      "                                                                 conv2d_14[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_13 (BatchNo (None, 36, 36, 128)  512         add_6[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_13 (Activation)      (None, 36, 36, 128)  0           batch_normalization_13[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_15 (Conv2D)              (None, 36, 36, 128)  147584      activation_13[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_14 (BatchNo (None, 36, 36, 128)  512         conv2d_15[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_14 (Activation)      (None, 36, 36, 128)  0           batch_normalization_14[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_16 (Conv2D)              (None, 36, 36, 128)  147584      activation_14[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_7 (Add)                     (None, 36, 36, 128)  0           add_6[0][0]                      \n",
      "                                                                 conv2d_16[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_15 (BatchNo (None, 36, 36, 128)  512         add_7[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_15 (Activation)      (None, 36, 36, 128)  0           batch_normalization_15[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_17 (Conv2D)              (None, 18, 18, 256)  295168      activation_15[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_16 (BatchNo (None, 18, 18, 256)  1024        conv2d_17[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_16 (Activation)      (None, 18, 18, 256)  0           batch_normalization_16[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_19 (Conv2D)              (None, 18, 18, 256)  33024       add_7[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_18 (Conv2D)              (None, 18, 18, 256)  590080      activation_16[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_8 (Add)                     (None, 18, 18, 256)  0           conv2d_19[0][0]                  \n",
      "                                                                 conv2d_18[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_17 (BatchNo (None, 18, 18, 256)  1024        add_8[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_17 (Activation)      (None, 18, 18, 256)  0           batch_normalization_17[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_20 (Conv2D)              (None, 18, 18, 256)  590080      activation_17[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_18 (BatchNo (None, 18, 18, 256)  1024        conv2d_20[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_18 (Activation)      (None, 18, 18, 256)  0           batch_normalization_18[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_21 (Conv2D)              (None, 18, 18, 256)  590080      activation_18[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_9 (Add)                     (None, 18, 18, 256)  0           add_8[0][0]                      \n",
      "                                                                 conv2d_21[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_19 (BatchNo (None, 18, 18, 256)  1024        add_9[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_19 (Activation)      (None, 18, 18, 256)  0           batch_normalization_19[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_22 (Conv2D)              (None, 18, 18, 256)  590080      activation_19[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_20 (BatchNo (None, 18, 18, 256)  1024        conv2d_22[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_20 (Activation)      (None, 18, 18, 256)  0           batch_normalization_20[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_23 (Conv2D)              (None, 18, 18, 256)  590080      activation_20[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_10 (Add)                    (None, 18, 18, 256)  0           add_9[0][0]                      \n",
      "                                                                 conv2d_23[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_21 (BatchNo (None, 18, 18, 256)  1024        add_10[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "activation_21 (Activation)      (None, 18, 18, 256)  0           batch_normalization_21[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_24 (Conv2D)              (None, 18, 18, 256)  590080      activation_21[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_22 (BatchNo (None, 18, 18, 256)  1024        conv2d_24[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_22 (Activation)      (None, 18, 18, 256)  0           batch_normalization_22[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_25 (Conv2D)              (None, 18, 18, 256)  590080      activation_22[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_11 (Add)                    (None, 18, 18, 256)  0           add_10[0][0]                     \n",
      "                                                                 conv2d_25[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_23 (BatchNo (None, 18, 18, 256)  1024        add_11[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "activation_23 (Activation)      (None, 18, 18, 256)  0           batch_normalization_23[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_26 (Conv2D)              (None, 18, 18, 256)  590080      activation_23[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_24 (BatchNo (None, 18, 18, 256)  1024        conv2d_26[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_24 (Activation)      (None, 18, 18, 256)  0           batch_normalization_24[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_27 (Conv2D)              (None, 18, 18, 256)  590080      activation_24[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_12 (Add)                    (None, 18, 18, 256)  0           add_11[0][0]                     \n",
      "                                                                 conv2d_27[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_25 (BatchNo (None, 18, 18, 256)  1024        add_12[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "activation_25 (Activation)      (None, 18, 18, 256)  0           batch_normalization_25[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_28 (Conv2D)              (None, 18, 18, 256)  590080      activation_25[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_26 (BatchNo (None, 18, 18, 256)  1024        conv2d_28[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_26 (Activation)      (None, 18, 18, 256)  0           batch_normalization_26[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_29 (Conv2D)              (None, 18, 18, 256)  590080      activation_26[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_13 (Add)                    (None, 18, 18, 256)  0           add_12[0][0]                     \n",
      "                                                                 conv2d_29[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_27 (BatchNo (None, 18, 18, 256)  1024        add_13[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "activation_27 (Activation)      (None, 18, 18, 256)  0           batch_normalization_27[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_30 (Conv2D)              (None, 9, 9, 512)    1180160     activation_27[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_28 (BatchNo (None, 9, 9, 512)    2048        conv2d_30[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_28 (Activation)      (None, 9, 9, 512)    0           batch_normalization_28[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_32 (Conv2D)              (None, 9, 9, 512)    131584      add_13[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_31 (Conv2D)              (None, 9, 9, 512)    2359808     activation_28[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_14 (Add)                    (None, 9, 9, 512)    0           conv2d_32[0][0]                  \n",
      "                                                                 conv2d_31[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_29 (BatchNo (None, 9, 9, 512)    2048        add_14[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "activation_29 (Activation)      (None, 9, 9, 512)    0           batch_normalization_29[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_33 (Conv2D)              (None, 9, 9, 512)    2359808     activation_29[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_30 (BatchNo (None, 9, 9, 512)    2048        conv2d_33[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_30 (Activation)      (None, 9, 9, 512)    0           batch_normalization_30[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_34 (Conv2D)              (None, 9, 9, 512)    2359808     activation_30[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_15 (Add)                    (None, 9, 9, 512)    0           add_14[0][0]                     \n",
      "                                                                 conv2d_34[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_31 (BatchNo (None, 9, 9, 512)    2048        add_15[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "activation_31 (Activation)      (None, 9, 9, 512)    0           batch_normalization_31[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_35 (Conv2D)              (None, 9, 9, 512)    2359808     activation_31[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_32 (BatchNo (None, 9, 9, 512)    2048        conv2d_35[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_32 (Activation)      (None, 9, 9, 512)    0           batch_normalization_32[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_36 (Conv2D)              (None, 9, 9, 512)    2359808     activation_32[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_16 (Add)                    (None, 9, 9, 512)    0           add_15[0][0]                     \n",
      "                                                                 conv2d_36[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_37 (Conv2D)              (None, 9, 9, 2048)   9439232     add_16[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_38 (Conv2D)              (None, 9, 9, 2048)   37750784    conv2d_37[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_1 (Concatenate)     (None, 9, 9, 2560)   0           conv2d_38[0][0]                  \n",
      "                                                                 add_16[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_1 (Conv2DTrans (None, 18, 18, 512)  11796992    concatenate_1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_39 (Conv2D)              (None, 18, 18, 512)  2359808     conv2d_transpose_1[0][0]         \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_2 (Concatenate)     (None, 18, 18, 768)  0           conv2d_39[0][0]                  \n",
      "                                                                 add_13[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_2 (Conv2DTrans (None, 36, 36, 256)  1769728     concatenate_2[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_40 (Conv2D)              (None, 36, 36, 256)  590080      conv2d_transpose_2[0][0]         \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_3 (Concatenate)     (None, 36, 36, 384)  0           conv2d_40[0][0]                  \n",
      "                                                                 add_7[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_3 (Conv2DTrans (None, 72, 72, 128)  442496      concatenate_3[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_41 (Conv2D)              (None, 72, 72, 128)  147584      conv2d_transpose_3[0][0]         \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_4 (Concatenate)     (None, 72, 72, 192)  0           conv2d_41[0][0]                  \n",
      "                                                                 add_3[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_4 (Conv2DTrans (None, 144, 144, 64) 110656      concatenate_4[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_42 (Conv2D)              (None, 144, 144, 64) 36928       conv2d_transpose_4[0][0]         \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_5 (Concatenate)     (None, 144, 144, 128 0           conv2d_42[0][0]                  \n",
      "                                                                 activation_1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_5 (Conv2DTrans (None, 288, 288, 32) 36896       concatenate_5[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_43 (Conv2D)              (None, 288, 288, 32) 9248        conv2d_transpose_5[0][0]         \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_44 (Conv2D)              (None, 288, 288, 1)  289         conv2d_43[0][0]                  \n",
      "==================================================================================================\n",
      "Total params: 85,795,297\n",
      "Trainable params: 85,781,089\n",
      "Non-trainable params: 14,208\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = RSSegResNet.build_resnet_34((3,288,288),1)\n",
    "model.compile(loss=bce_dice_loss, optimizer=Adam(), metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/300\n",
      "Found 220453 images belonging to 1 classes.\n",
      "Found 220453 images belonging to 1 classes.\n",
      "11999/12000 [============================>.] - ETA: 0s - loss: 0.5121 - acc: 0.9235Found 60317 images belonging to 1 classes.\n",
      "Found 60317 images belonging to 1 classes.\n",
      "12000/12000 [==============================] - 5159s 430ms/step - loss: 0.5121 - acc: 0.9235 - val_loss: 0.4482 - val_acc: 0.9328\n",
      "Epoch 2/300\n",
      "12000/12000 [==============================] - 5095s 425ms/step - loss: 0.3942 - acc: 0.9410 - val_loss: 0.3731 - val_acc: 0.9423\n",
      "Epoch 3/300\n",
      "12000/12000 [==============================] - 5098s 425ms/step - loss: 0.3691 - acc: 0.9444 - val_loss: 0.3661 - val_acc: 0.9464\n",
      "Epoch 4/300\n",
      "12000/12000 [==============================] - 5098s 425ms/step - loss: 0.3575 - acc: 0.9458 - val_loss: 0.3388 - val_acc: 0.9490\n",
      "Epoch 5/300\n",
      "12000/12000 [==============================] - 5094s 425ms/step - loss: 0.3476 - acc: 0.9471 - val_loss: 0.3260 - val_acc: 0.9504\n",
      "Epoch 6/300\n",
      "12000/12000 [==============================] - 5097s 425ms/step - loss: 0.3439 - acc: 0.9476 - val_loss: 0.3287 - val_acc: 0.9499\n",
      "Epoch 7/300\n",
      "12000/12000 [==============================] - 5098s 425ms/step - loss: 0.3402 - acc: 0.9481 - val_loss: 0.3391 - val_acc: 0.9487\n",
      "Epoch 8/300\n",
      "12000/12000 [==============================] - 5098s 425ms/step - loss: 0.3373 - acc: 0.9485 - val_loss: 0.3466 - val_acc: 0.9454\n",
      "Epoch 9/300\n",
      "12000/12000 [==============================] - 5096s 425ms/step - loss: 0.2878 - acc: 0.9560 - val_loss: 0.2733 - val_acc: 0.9585\n",
      "Epoch 10/300\n",
      "12000/12000 [==============================] - 5099s 425ms/step - loss: 0.2711 - acc: 0.9577 - val_loss: 0.2592 - val_acc: 0.9604\n",
      "Epoch 11/300\n",
      "12000/12000 [==============================] - 5096s 425ms/step - loss: 0.2632 - acc: 0.9585 - val_loss: 0.2621 - val_acc: 0.9578\n",
      "Epoch 12/300\n",
      "12000/12000 [==============================] - 5095s 425ms/step - loss: 0.2583 - acc: 0.9588 - val_loss: 0.2586 - val_acc: 0.9587\n",
      "Epoch 13/300\n",
      "12000/12000 [==============================] - 5097s 425ms/step - loss: 0.2547 - acc: 0.9590 - val_loss: 0.2523 - val_acc: 0.9591\n",
      "Epoch 14/300\n",
      "12000/12000 [==============================] - 5102s 425ms/step - loss: 0.2501 - acc: 0.9596 - val_loss: 0.2558 - val_acc: 0.9577\n",
      "Epoch 15/300\n",
      "12000/12000 [==============================] - 5090s 424ms/step - loss: 0.2477 - acc: 0.9597 - val_loss: 0.2457 - val_acc: 0.9587\n",
      "Epoch 16/300\n",
      "12000/12000 [==============================] - 5088s 424ms/step - loss: 0.2456 - acc: 0.9599 - val_loss: 0.2381 - val_acc: 0.9621\n",
      "Epoch 17/300\n",
      "12000/12000 [==============================] - 5101s 425ms/step - loss: 0.2429 - acc: 0.9603 - val_loss: 0.2569 - val_acc: 0.9571\n",
      "Epoch 18/300\n",
      "12000/12000 [==============================] - 5101s 425ms/step - loss: 0.2415 - acc: 0.9604 - val_loss: 0.2385 - val_acc: 0.9613\n",
      "Epoch 19/300\n",
      "12000/12000 [==============================] - 5103s 425ms/step - loss: 0.2409 - acc: 0.9603 - val_loss: 0.2449 - val_acc: 0.9583\n",
      "Epoch 20/300\n",
      "12000/12000 [==============================] - 5100s 425ms/step - loss: 0.2313 - acc: 0.9620 - val_loss: 0.2274 - val_acc: 0.9627\n",
      "Epoch 21/300\n",
      "12000/12000 [==============================] - 5062s 422ms/step - loss: 0.2295 - acc: 0.9623 - val_loss: 0.2293 - val_acc: 0.9613\n",
      "Epoch 22/300\n",
      "12000/12000 [==============================] - 5054s 421ms/step - loss: 0.2281 - acc: 0.9626 - val_loss: 0.2410 - val_acc: 0.9602\n",
      "Epoch 23/300\n",
      "12000/12000 [==============================] - 5050s 421ms/step - loss: 0.2272 - acc: 0.9627 - val_loss: 0.2179 - val_acc: 0.9638\n",
      "Epoch 24/300\n",
      "12000/12000 [==============================] - 5051s 421ms/step - loss: 0.2267 - acc: 0.9627 - val_loss: 0.2364 - val_acc: 0.9604\n",
      "Epoch 25/300\n",
      "12000/12000 [==============================] - 5049s 421ms/step - loss: 0.2260 - acc: 0.9629 - val_loss: 0.2271 - val_acc: 0.9629\n",
      "Epoch 26/300\n",
      "12000/12000 [==============================] - 5050s 421ms/step - loss: 0.2254 - acc: 0.9629 - val_loss: 0.2313 - val_acc: 0.9616\n",
      "Epoch 27/300\n",
      "12000/12000 [==============================] - 5047s 421ms/step - loss: 0.2248 - acc: 0.9630 - val_loss: 0.2319 - val_acc: 0.9615\n",
      "Epoch 28/300\n",
      "12000/12000 [==============================] - 5048s 421ms/step - loss: 0.2248 - acc: 0.9630 - val_loss: 0.2214 - val_acc: 0.9639\n",
      "Epoch 29/300\n",
      "12000/12000 [==============================] - 5048s 421ms/step - loss: 0.2238 - acc: 0.9632 - val_loss: 0.2338 - val_acc: 0.9608\n",
      "Epoch 30/300\n",
      "12000/12000 [==============================] - 5048s 421ms/step - loss: 0.2251 - acc: 0.9629 - val_loss: 0.2297 - val_acc: 0.9624\n",
      "Epoch 31/300\n",
      "12000/12000 [==============================] - 5041s 420ms/step - loss: 0.2244 - acc: 0.9631 - val_loss: 0.2166 - val_acc: 0.9645\n",
      "Epoch 32/300\n",
      "12000/12000 [==============================] - 5032s 419ms/step - loss: 0.2240 - acc: 0.9631 - val_loss: 0.2365 - val_acc: 0.9604\n",
      "Epoch 33/300\n",
      "12000/12000 [==============================] - 5038s 420ms/step - loss: 0.2240 - acc: 0.9631 - val_loss: 0.2291 - val_acc: 0.9616\n",
      "Epoch 34/300\n",
      "12000/12000 [==============================] - 5039s 420ms/step - loss: 0.2246 - acc: 0.9631 - val_loss: 0.2389 - val_acc: 0.9609\n"
     ]
    }
   ],
   "source": [
    "callback_list = [\n",
    "    EarlyStopping(\n",
    "        monitor='acc',\n",
    "        patience=5,\n",
    "    ),\n",
    "    ModelCheckpoint(\n",
    "        filepath='building_seg_resnet50_bcedice_0905.h5',\n",
    "        monitor='val_loss',\n",
    "        save_best_only=True,\n",
    "    ),\n",
    "    ReduceLROnPlateau(\n",
    "        monitor='val_loss',\n",
    "        factor=0.1,\n",
    "        patience=3,\n",
    "    ),\n",
    "    TensorBoard(\n",
    "        log_dir = 'logs'\n",
    "    ),\n",
    "]\n",
    "\n",
    "history = model.fit_generator(make_train_generator(),\n",
    "                              epochs=300,\n",
    "                              steps_per_epoch=12000,\n",
    "                              validation_data=make_val_generator(),\n",
    "                              validation_steps=50,\n",
    "                              callbacks=callback_list,\n",
    "                              verbose=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "acc = history.history['acc']\n",
    "val_acc = history.history['val_acc']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "epochs = range(1, len(acc) + 1)\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.legend()\n",
    "plt.figure()\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
